using System;

namespace Leetcode_Array.Script.ListNode203
{
    

    //=================================
    public class ListNode{
        public int val;
        public ListNode next;
        public ListNode(int val = 0, ListNode next = null){
            this.val = val;
            this.next = next;
        }
    } 


    class DeleteListNode203
    {
        //===================================== 力扣203.移除链表元素 ===========================
        //题意：删除链表中等于给定值 val 的所有节点。
        // 示例 1：
        // 输入：head = [1,2,6,3,4,5,6], val = 6
        // 输出：[1,2,3,4,5]

        // 示例 2：
        // 输入：head = [], val = 1
        // 输出：[]

        // 示例 3：
        // 输入：head = [7,7,7,7], val = 7
        // 输出：[]

        // 方法一：直接删除链表元素
        public ListNode RemoveElements(ListNode head, int val)
        {
            while(head != null && head.val == val)//不用if
            {//检查头结点
                head = head.next;
            }

            ListNode cur = head;
            while(cur != null && cur.next != null)
            {//挨着检查后面节点

                if(cur.next.val == val)
                {//移除元素
                    cur.next = cur.next.next;
                }else{
                    cur = cur.next;
                }
            }
            return head;
        }

        // 方法二：设置虚拟链表头
        public ListNode removeElements_2(ListNode head, int val)
        {
            //设置虚拟头结点
            ListNode begin = new ListNode(-1,null);
            begin.next = head;

            ListNode cur = begin;
            while( cur.next != null && cur.val != 0)
            {//检查节点
                if(cur.next.val == val)
                {//移除节点
                    cur.next = cur.next.next;
                }else{
                    cur = cur.next;
                }
            }
            //还原头结点
            head = begin.next;
            return head;
        }

    }
   
}